#include "includes.h"
#include "usart2.h"

u8 g_ucIoPutDelay = 0;										  //摄像头IO输出延时
//static u8 beepFewTimes = 0;              	//蜂鸣器响几声
  
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: TIM4_IRQHandler
** 功能描述: 定时器7中断服务程序	
** 参数描述：无
** 作  　者: msl
** 日　  期: 2015年12月18日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
UINT32 test_f = 0;
#define	P_Out_LED1_t	 	PCout(10)
void TIM4_IRQHandler(void)
{ 	
	OSIntEnter();							//进入中断
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//是更新中断
	{	 		
		Usart2Receive_IdleCheck();	
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update);  //清除TIM7更新中断标志

		
		/*
		if (test_f == 0)
		{	
			test_f = 1;
			P_Out_LED1_t = 0;
		}
		else
		{
			test_f = 0;
			P_Out_LED1_t = 1;		
		}	
		TIM_SetCounter(TIM4,0);
		TIM_Cmd(TIM4,ENABLE);	
		*/	
	}	
	OSIntExit();       	 					//触发任务切换软中断	
}
 

/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: TIM4_Int_Init
** 功能描述: 10ms 定时中断初始化
** 参数描述：这里时钟选择为APB1的2倍，而APB1为42M
						//arr：自动重装值。
						//psc：时钟预分频数
						//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
						//Ft=定时器工作频率,单位:Mhz 
						//通用定时器中断初始化
						//这里始终选择为APB1的2倍，而APB1为36M
						//arr：自动重装值。
						//psc：时钟预分频数	
** 作  　者: Dream
** 日　  期: 2011年6月20日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void TIM4_Int_Init(u16 arr,u16 psc)
{	
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//TIM7时钟使能    
	
	//定时器TIM4初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM7中断,允许更新中断
	
	TIM_Cmd(TIM4,ENABLE);//开启定时器4
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=4 ;//抢占优先级0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;		//子优先级2
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	
}
	 
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: TIM3_IRQHandler
** 功能描述: 定时器3中断服务程序	
** 参数描述：无
** 作  　者: msl
** 日　  期: 2015年12月18日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void TIM3_IRQHandler(void)
{ 	
	OSIntEnter();							//进入中断
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//是更新中断
	{	 			   
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIM7更新中断标志 
	}	   
	OSIntExit();       	 					//触发任务切换软中断	
}
 

/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: TIM3_Int_Init
** 功能描述: 50ms 定时中断初始化
** 参数描述：这里时钟选择为APB1的2倍，而APB1为42M
						//arr：自动重装值。
						//psc：时钟预分频数
						//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
						//Ft=定时器工作频率,单位:Mhz 
						//通用定时器中断初始化
						//这里始终选择为APB1的2倍，而APB1为36M
						//arr：自动重装值。
						//psc：时钟预分频数	
** 作  　者: Dream
** 日　  期: 2011年6月20日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void TIM3_Int_Init(u16 arr,u16 psc)
{	
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//TIM3时钟使能    
	
	//定时器TIM4初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM7中断,允许更新中断
	
	TIM_Cmd(TIM3,ENABLE);//开启定时3
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;		//子优先级2
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	
	TIM_Cmd(TIM3,DISABLE);			//关闭定时器3
	
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: Open_Lock
** 功能描述: 开锁
** 参数描述：无
** 作  　者: msl
** 日　  期: 2015年12月18日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void Open_Lock(void)
{

	
}

/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: ControlPhotograph
** 功能描述: 控制拍照
** 参数描述：无
** 作  　者: msl
** 日　  期: 2015年12月18日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

void	ControlPhotograph(void)
{

}






#define	USER_WDG_Enable		1

//初始化独立看门狗
//prer:分频数:0~7(只有低3位有效!)
//rlr:自动重装载值,0~0XFFF.
//分频因子=4*2^prer.但最大值只能是256!
//rlr:重装载寄存器值:低11位有效.
//时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms).

void IWDG_Init(u8 prer,u16 rlr)
{
#if USER_WDG_Enable	
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对IWDG->PR IWDG->RLR的写
	
	IWDG_SetPrescaler(prer); //设置IWDG分频系数

	IWDG_SetReload(rlr);   //设置IWDG装载值

	IWDG_ReloadCounter(); //reload
	
	IWDG_Enable();       //使能看门狗
#endif	
}

void IWDG_Feed(void)
{
#if USER_WDG_Enable	
#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr = 0u;
#endif	
//	printf("WDG_ReLOAD\n");
	 
	OS_ENTER_CRITICAL();
	IWDG_ReloadCounter();	//reload
	OS_EXIT_CRITICAL();
#endif	
}







